const sugar = loader('sugar');
const pars_midd = loader("pars_midd");
const fs = loader("fs");
//路由的内核
class Route{
    //路由初始化
    static init({filepath="",path="/",group_midd=[],group_prefix="",file_prefix="",file_midd=[]},bool=false){
        //Route运行时需要的数据
        this.RouteData={
            //文件路径  //组级中间件  //组级前缀
            filepath, group_midd, group_prefix,
            //文件级别的前缀  //文件级别的中间件
            file_prefix, file_midd:global.route.globalRouter.concat(pars_midd(file_midd || [])),
        };
        if(!bool){
            global.runRoute[filepath]={any:{},get:{},post:{}};
            //添加路由参数功能 routingParameters
            global.runRouter[filepath]={any:{},get:{},post:{}};
        }else{
            global.runRoute[filepath] || (global.runRoute[filepath]={any:{},get:{},post:{}});
            //添加路由参数功能 routingParameters
            global.runRouter[filepath] = (global.runRouter[filepath]={any:{},get:{},post:{}});
        }
    }

    //执行分组
    static group({prefix="",midd=[]},fun){
        this.RouteData.group_midd=pars_midd(midd);
        this.RouteData.group_prefix = prefix.startsWith("/")?prefix:"/"+prefix;
        fun();
        this.RouteData.group_prefix="";
    }
    //any请求
    static any(url,fun) {
        return Route.generateRout('any',url,this.pars_fun(fun));
    }

    static get(url,fun) {
        return Route.generateRout('get',url,this.pars_fun(fun));
    }

    static post(url,fun) {
        // console.log([url,fun])
        return Route.generateRout('post',url,this.pars_fun(fun));
    }

    static use(type,url,fun){
        if(!fun){
            this.get(type,url);
        }else if(this[type]){
            this[type](url,fun);
        }else{
            console.log("没有这个类型的路由",type)
        }
    }

    //解析方法
    static pars_fun(fun){
        if(!fun)return
        if(typeof fun === "string"){
            //执行解析
            let [path,name] = fun.split("@")
            if(!fs.existsSync(sugar.path("<controller>"+path+".js"))){
                console.log("控制器文件不存在",sugar.path("<controller>"+path+".js"));
                return ;
            }
            //进行导入
            fun = loader("<controller>"+path,true)
            if(fun && fun[name]){return fun[name]}
            console.log(path+"控制器不存在")
            return ()=>{return "该接口控制器不存在"};
        }else if(typeof fun === "function"){
            return fun;
        }else{
            console.log("未知类型的控制器表达方式",fun);
        }
    }


    //生成路由
    static generateRout(type,url,fun){
        if(!type || !url || !fun){console.log("出现异常数据,可能由其他模块bug导致，Route.72");
            console.log([type,url,fun]); return }

        !url.startsWith("/") && (url = "/"+url);
        //生成完整的url
        url = this.RouteData.file_prefix+this.RouteData.group_prefix+url;

        //判断是否是有路由参数的路由
        if(Route.isParameter(url)){
            //这是一个路由参数，生成正则表达式
            global.runRouter[this.RouteData.filepath][type][url]=
                {...Route.generate(url),midd:this.RouteData.file_midd,controller:fun};
            return{
                midd(...data){
                    let midd = pars_midd(Route.RouteData.group_midd.concat(data));
                    global.runRouter[Route.RouteData.filepath][type][url].midd=
                        global.runRouter[Route.RouteData.filepath][type][url].midd.concat(midd);
            }}
        }else{
            global.runRoute[this.RouteData.filepath][type][url] =
                {controller:fun,midd:this.RouteData.file_midd};
        }
        //调用中间件
        return{
            midd(...data){
                let midd = pars_midd(Route.RouteData.group_midd.concat(data));
                global.runRoute[Route.RouteData.filepath][type][url].midd=
                    global.runRoute[Route.RouteData.filepath][type][url].midd.concat(midd);
        }}
    }



    //判断是否带有路由参数
    static isParameter(str){
        return /\/:[^/]*/g.test(str);
    }

    //生成正则
    static generate(str){
        let parameter = str.match(/\/:[^/]*/g).map(a =>a.substring(2));
        //替换字
        let replace = str.split(/\/:[^/]*/g).filter(res=>res);
        //转换关键字
        str = str.replace(/\//g,"<_GEM_>");
        //生成正则表达式
        let regular =new RegExp("^"+str.replace(/(:((?!<_GEM_>).)+)/g,`((?!<_GEM_>).)+`)+"$");
        return{
            parameter,
            replace,
            regular
        }
    }
}

module.exports=Route;


/***
 * 
{
    'bright'    : '\x1B[1m', // 亮色
    'grey'      : '\x1B[2m', // 灰色
    'italic'    : '\x1B[3m', // 斜体
    'underline' : '\x1B[4m', // 下划线
    'reverse'   : '\x1B[7m', // 反向
    'hidden'    : '\x1B[8m', // 隐藏
    'black'     : '\x1B[30m', // 黑色
    'red'       : '\x1B[31m', // 红色
    'green'     : '\x1B[32m', // 绿色
    'yellow'    : '\x1B[33m', // 黄色
    'blue'      : '\x1B[34m', // 蓝色
    'magenta'   : '\x1B[35m', // 品红
    'cyan'      : '\x1B[36m', // 青色
    'white'     : '\x1B[37m', // 白色
    'blackBG'   : '\x1B[40m', // 背景色为黑色
    'redBG'     : '\x1B[41m', // 背景色为红色
    'greenBG'   : '\x1B[42m', // 背景色为绿色
    'yellowBG'  : '\x1B[43m', // 背景色为黄色
    'blueBG'    : '\x1B[44m', // 背景色为蓝色
    'magentaBG' : '\x1B[45m', // 背景色为品红
    'cyanBG'    : '\x1B[46m', // 背景色为青色
    'whiteBG'   : '\x1B[47m' // 背景色为白色
}
 */